QUIC的丢包恢复机制概述¶
我们简要的描述了QUIC在传输、ack接受(ack reception)以及计时器到期( timer expiration)时采取的措施。
发送一个数据包时(On Sending a Packet)¶
发送一个数据包时
一个重传计时器将会基于以下的规则被设立:
如果握手还没有完成,则开始一个握手计时器
- SRTT的1.5倍,具有指数退避。
如果存在未完成(outstanding)且已被NACK的未完成数据包,则可能设置丢失计时器
- 取决于丢失检测实现,在Early Retransmit的情况下默认为0.25RTT。
如果发送的TLP(Tail Loss Probe)少于2个,则计算并重新启动TLP计时器。
- 如果线路中有多个数据包,则定时器设置为(10ms,2 * SRTT)中的较大值
- 如果线路中只有一个数据包,则将定时器设置为(1.5*SRTT + delayed ack timer, 2*SRTT)中的较大值
如果发送的TLP达到了两个,则设定RTO计时器
- 计时器在第一个RTO过了之后将被设定为(200ms, SRTT+4*RTTVAR)中的较大值,且满足指数退避。
接收一个ACK时(On Receiving an ACK)¶
接收一个ACK时
以下的步骤为当一个ACK被接收时采取的措施:
- 验证ack,包括忽略任何无序的确认。
- 更新RTT测量器
- 发送端以ACKED标记序列号低于最大观测范围(largest_observed)且未被NACK的数据包
- 数据包编号小于最大观测值(largest_observed)且未被NACK的具有基于FACK递增的missing_reports值。(largest_observed - 丢失数据包编号)
- 阈值(Threshold)被默认的设定为3
- 具有missing_reports值且missing_reports > Threshold 的数据包被标记为需要重传。该逻辑一起实现了快速重传和基于FACK的重传。
- 如果nacked数据包未完成且观察到的最大数据包是最大发送数据包,则重传计时器将设置为0.25SRTT,实现具有计时器的Early Retransmit。
- 如果不存在未完成的数据包,则停止计时器
计时器停止时(On Timer Expiration)¶
QUIC使用一个丢失恢复计时器,该计时器在设置时可以处于多种状态之一。 当计时器到期时,状态确定要执行的动作。 (TODO:描述定时器何时设置)
- 握手(Handshake)状态
- 重传任何未完成握手的数据包
- 丢包计时(Loss timer)状态
- 丢失到目前为止已被NACK的未完成数据包。
- 将丢包情况报告给拥塞控制器。
- 在拥塞控制器允许的范围内尽可能多的重传
- 尾包丢失检测(TLP)状态
- 重传最小的可重传的未完成数据包。
- 在ACK到达之前,不要将任何数据包标记为丢失。
- 重启TLP或RTO的计时器。
- 重传超时时间(Retransmission TimeOut)状态
- 不要使拥塞窗口骤减(即:设置为1个数据包),直到ack到达并确认RTO不是虚假的。 请注意,此步骤不需要实施FRTO。
- 重启下一个RTO的定时器(带指数退避)。